package syn;

// 不安全银行
public class UnsafeBank {
    public static void main(String[] args) {
        Account account = new Account(100,"card0001");
        // 你要取50元,你女朋友要取100，这时候同时取，卡里余额就会-50，但正常情况，应该提示女朋友取的时候，钱不够了，
        // 这是因为，他们把账户余额100放在各自线程的工作空间操作，操作完之后，
        Drawing you = new Drawing(account,50,"you");
        Drawing yougrilfriends = new Drawing(account,100,"yougrilfriends");

        you.start();
        yougrilfriends.start();

        /*
            结婚基金余额50
            you手里的钱：50
            结婚基金余额-50
            yougrilfriends手里的钱：100
         */

        /*
            结婚基金余额50
            you手里的钱：50
            yougrilfriends钱不够了，取不了
         */

    }
}

// 银行：模拟取款  取钱操作是多线程
class Drawing extends Thread{
    final Account account; //账户
    int drawingMoney; //取了多少钱
    int nowMoney; //现在手里多少钱
    public Drawing(Account account,int drawingMoney,String name){
        super(name);  //the name of the new thread  name = 新线程的名称
        this.drawingMoney = drawingMoney;
        this.account = account;
    }

    // 取钱
    @Override
    public void run() {
        // 锁住同步监视器：监视取钱操作,锁住这个账户，第二个线程过来，发现同步监视器被锁定，无法访问，取钱操作是在排队一个一个执行
        synchronized (account){
            // 判断有没有钱
            if (account.money - drawingMoney < 0){
                System.out.println(Thread.currentThread().getName()+"钱不够了，取不了");
                return;
            }
            // 模拟延时
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            // 卡里余额 = 余额 - 你取的钱
            account.money = account.money - drawingMoney;
            System.out.println("结婚基金余额" + account.money);
            // 你手里的钱
            nowMoney = nowMoney + drawingMoney;
            //this.getName() = Thread.currentThread().getName()
            System.out.println(this.getName() + "手里的钱："+nowMoney);
        }
    }
}


// 账户
class Account{
    int money; //余额
    String name; //卡名
    public Account(int money,String name){
        this.money = money;
        this.name = name;
    }
}
